package com.wjm.core;

import com.wjm.http.EmptyRequestException;
import com.wjm.http.HttpContext;
import com.wjm.http.HttpRequest;
import com.wjm.http.HttpResponse;
import com.wjm.servlet.RegisterServlet;

import java.io.File;
import java.io.IOException;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

/**
 * Data:2022年08月03日
 * Author:wjm
 * Content:
 *
 *   负责与指定客户端HTTP交互
 *      该线程来与客户端交互的过程必须遵守HTTP协议要求，采取一问一答的方式进行，固定的解析步骤：
 *       1）解析请求【问】
 *       2）处理请求
 *       3）响应请求【答】
 *
 */
public class RequestHandle implements Runnable{
    //声明一个Socket变量
    private Socket socket;

    /**
     * 用来接收从WebServer传过来的socket，socket封装着每一个客户端发送过来的所有信息
     * @param socket 从WebServer传过来的socket
     */
    public RequestHandle(Socket socket){
        this.socket = socket;
    }


    @Override
    public void run() {
        try{

            //1.解析请求
            HttpRequest httpRequest= new HttpRequest(socket);


            //2.处理请求
            String url = httpRequest.getUrl();
            //创建HttpResponse对象，并传入socket
            HttpResponse httpResponse = new HttpResponse(socket);

            if ("/myweb/register.do".equals(httpRequest.getRequestURL())){
                //如果RequestURL会等于/myweb/register.do，则说明这是一个注册功能
                RegisterServlet register = new RegisterServlet();
                register.service(httpResponse,httpRequest);


            }else if ("/myweb/login.do".equals(httpRequest.getRequestURL())){
                //如果RequestURL会等于/myweb/login.do，则说明这是一个登入功能



            }else {
                //如果都不是，则说明这是客户端在请求实体资源

            /*
            ./webapps/ 可以认为是一个存放所以资源的文件夹，当需要某个应用的资源文件时，就可以在webapps下面查找
            要求客户端在输入请求资源时，一并输入应用的名称，例如：
                  应用是找：myweb
                  资源是找：index.html
                  客户端发送的请求是：http://localhost:8080/myweb/index.html
            */
                File file = new File("./webapps" + url);


                //判断资源是否存在，并且是否为文件夹
                if (file.exists() && file.isFile()) {//如果是就将客户端所需的资源返回
                    //将文件资源对象传给HttpResponse
                    httpResponse.setFileEntity(file);
                } else {
                    //如果不符合则返回404页面
                    file = new File("./webapps/commons/404.html");
                    //将文件资源对象传给HttpResponse
                    httpResponse.setFileEntity(file);
                    //设置状态码
                    httpResponse.setStatusCode(404);
                    //设置状态说明
                    httpResponse.setStatusReason("NOT FOUND");
                }
            }

            //发送响应
            httpResponse.flush();
            System.out.println("数据响应完毕！");



        }catch (EmptyRequestException e){
            System.err.println(e.getMessage()); // 控制台信息输出的时候显示的是红色，但是不会按逻辑输出
        }finally {

            try {
                socket.close();//释放系统资源
            } catch (IOException e) {
                e.printStackTrace();
            }
        }







    }






}
